//Source file: D:\\LeeXM\\JavaWS\\rumba\\src\\com\\hd123\\rumba\\domain\\biz\\IBDomainMgr.java

package com.hd123.rumba.domain.biz;

import java.util.List;

import net.sf.hibernate.HibernateException;

import com.hd123.rumba.cartridge.biz.BCartFunctionView;
import com.hd123.rumba.cartridge.biz.SCartFunctionView;
import com.hd123.rumba.domain.IDomain;
import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.organization.biz.IBOrganizationMgr;
import com.hd123.rumba.runtime.OperateContext;
import com.hd123.rumba.gwt.base.client.biz.BPersistent;
import com.hd123.rumba.runtime.biz.IBManager;

/**
 * 域 | 业务层 | 管理员 | 接口类
 */
public interface IBDomainMgr extends IBManager {

  /**
   * 根据uuid载入域。
   * 
   * @param uuid
   *          指定域的uuid。
   * @return com.hd123.rumba.domain.biz.BDomain 载入的域，若找不到，则返回null。
   * @throws BusinessException
   * @throws HibernateException
   */
  public BDomain loadDomain(String uuid) throws BusinessException, HibernateException;

  /**
   * 根据uuid取得域。
   * 
   * @param uuid
   *          指定域的uuid
   * @return com.hd123.rumba.domain.biz.SDomain 若找不到，返回null。
   */
  public SDomain getDomain(String uuid) throws BusinessException, HibernateException;

  /**
   * 取得根域对象。
   * 
   * @return 返回根域对象。
   * @throws BusinessException
   * @throws HibernateException
   */
  public SDomain getRootDomain() throws BusinessException, HibernateException;

  /**
   * 取得指定域相对当前域的位置。
   * 
   * @param currentDomain
   *          当前域，例如来自dd.getCurrentDomain()。
   * @param domain
   *          被检查的域。
   * @return 参见常量“VALUE_RELATIONSHIP_*”。
   * @throws BusinessException
   */
  public int getRelativePosition(IDomain currentDomain, BDomain domain) throws BusinessException,
      HibernateException;

  /** 域之间相对关系常量：自己 */
  public static final int VALUE_RELATIONSHIP_SELF = IBOrganizationMgr.VALUE_RELATIONSHIP_SELF;
  /** 域之间相对关系常量：下级域 */
  public static final int VALUE_RELATIONSHIP_LOWER = IBOrganizationMgr.VALUE_RELATIONSHIP_LOWER;
  /** 域之间相对关系常量：上级域 */
  public static final int VALUE_RELATIONSHIP_UPPER = IBOrganizationMgr.VALUE_RELATIONSHIP_UPPER;
  /** 域之间相对关系常量：兄弟域 */
  public static final int VALUE_RELATIONSHIP_BROTHER = IBOrganizationMgr.VALUE_RELATIONSHIP_BROTHER;
  /** 域之间相对关系常量：其它 */
  public static final int VALUE_RELATIONSHIP_OTHER = IBOrganizationMgr.VALUE_RELATIONSHIP_OTHER;

  /**
   * 取得指定域已经安装的所有构件包功能视图列表。
   * <p>
   * 若构件包未被正确安装，则不会出现在返回的列表中。
   * 
   * @param domainUuid
   *          指定的域的uuid。
   * @return 返回符合条件的构件包功能视图列表。若没有符合条件时返回空的列表。
   * @throws BusinessException
   * @throws HibernateException
   */
  public List<SCartFunctionView> getCFVsByDomain(String domainUuid) throws BusinessException,
      HibernateException;

  /**
   * 对指定域装载指定目标构件包功能视图，返回实际需要同时装载功能视图列表。
   * <p>
   * 返回的列表中也包括目标功能视图，同时列表的顺序就是装载的顺序。如果目标构件包功能视图所依赖的功能视图已经被装载到指定域中，则返回值中不包括。
   * 
   * @param targetCFVUuid
   *          指定目标装载的构件包功能视图uuid。
   * @param domainUuid
   *          指定域的uuid。
   * @return 返回构件包功能视图列表。
   * @throws BusinessException
   * @throws HibernateException
   */
  public List<BCartFunctionView> analyseLoadingCFVs(String targetCFVUuid, String domainUuid)
      throws BusinessException, HibernateException;

  /**
   * 指定目标构件包功能视图装载到指定的域中。
   * <p>
   * 将自动分析目标构件包功能视图所依赖，而指定域中没有的功能视图，并按照合法的顺序将这些功能视图装载到域中。
   * 
   * @param targetCFVUuid
   *          指定目标构件包功能视图uuid。
   * @param domainUuid
   *          指定域uuid。
   * @param operate
   * @param oca
   *          指定域的oca。
   * @throws BusinessException
   * @throws HibernateException
   * @throws InterruptedException
   */
  public void loadCFVsToDomainT(String targetCFVUuid, String domainUuid, OperateContext operate,
      long oca) throws BusinessException, HibernateException, InterruptedException;

  /**
   * 从指定的域中卸载指定目标构件包功能视图，返回将同时卸载的功能视图列表。
   * <p>
   * 返回的列表中也包括目标功能视图，同时列表的顺序就是卸载的顺序。如果依赖目标构件包功能视图的其它功能视图未被装载到指定域中，则返回值中不包括。
   * 
   * @param targetCFVUuid
   *          指定目标构件包功能视图uuid。
   * @param domainUuid
   *          指定域uuid。
   * @return 返回构件包功能视图列表。
   * @throws BusinessException
   * @throws HibernateException
   */
  public List<BCartFunctionView> analyseUnloadingCFVs(String targetCFVUuid, String domainUuid)
      throws BusinessException, HibernateException;

  /**
   * 从指定的域中卸载指定目标构件包功能视图。
   * <p>
   * 将自动分析依赖目标构件包功能视图，而指定域已经装载的功能视图，并按照合法的顺序将这些功能视图从域中卸载。
   * 
   * @param targetCFVUuid
   *          指定目标构件包功能视图uuid。
   * @param domainUuid
   *          指定域uuid。
   * @param operate
   * @param oca
   *          指定域的oca。
   * @throws BusinessException
   * @throws HibernateException
   * @throws InterruptedException
   */
  public void unloadCFVsFromDomainT(String targetCFVUuid, String domainUuid,
      OperateContext operate, long oca) throws BusinessException, HibernateException,
      InterruptedException;

  /**
   * 根据代码取得域。
   * 
   * @param <T>
   * @param code
   *          指定域的代码。
   * @param bizClass
   * @return 返回取得的域，若找不到则返回null。
   * @throws BusinessException
   * @throws HibernateException
   */
  public <T extends BPersistent> T getDomainByCode(String code, Class<T> bizClass)
      throws BusinessException, HibernateException;

  /**
   * 取得指定的域的所有可用直接下级域的列表(不包含本身)。
   * 
   * @param domainUuid
   *          指定的域
   * @return 域的列表
   * 
   * @throws BusinessException
   * @throws HibernateException
   */
  public List<SDomain> loadDomainsByParent(String domainUuid) throws BusinessException,
      HibernateException;
}
